Profile picture

[Linux] 리눅스 시스템 부팅 프로세스 정리

JaehyoJJAng2025년 06월 15일

개요

컴퓨터 전원 버튼을 누른 후 운영체제(OS) 화면이 나타나기까지, 컴퓨터 내부에서는 순차적인 과정이 일어납니다!


  • 1. 하드웨어 단계
    • 전원 ON!
    • Legacy BIOS
    • UEFI
  • 2. 부트로더 단계
    • 부트로더 위치 찾기 -> 시작하기
    • 부트로더 운영체제 선택
  • 3. 커널 단계
    • 선택된 운영체제와 호환되는 커널(vmliuz-<version>) 및 초기 램디스크(initrd) 시작
    • 초기화 프로세스(init or systemd) 시작
  • 4. Init 단계
    • 선택된 run level 또는 target에 따라 서비스 시작!

linux 부팅 프로세스

이번 챕터에서는 리눅스 시스템에서의 부팅 순서를 총 4단계로 순서로 나누어 살펴보려고 합니다!


1. 하드웨어 단계

image

1-1. 전원 ON

PC에 전원 버튼을 누르면 메인보드에 전기가 공급되고, CPU가 깨어나겠죠?


이때 CPU는 가장 먼저 정해진 주소(리셋 백터)로 점프하여 그곳에 있는 펌웨어(BIOS 또는 UEFI) 코드를 실행하기 시작합니다.

부팅 전 메모리에는 무엇이 있을까?

전원이 켜지는 순간, RAM은 거의 비어있는 상태입니다. BIOS/UEFI 펌웨어 코드가 메모리에 올라와 가장 먼저 실행되며, 하드웨어 점검과 부트로더를 찾는 임무를 수행하게 되는거죠.


특히 BIOS는 레거시 바이오스라고도 부르며, 하드디스크의 첫 Sector를 읽고, 첫 섹터에 지시된 주소에 있는 코드를 실행하도록 하는 부팅 절차를 따릅니다.


1-2. POST(Power-On Self-Test)

부팅 이후에 삑! 하는 비프음을 들으신 적 있으시죠?


BIOS는 삑! 소리와 함께 시스템의 주요 하드웨어(RAM, CPU, 키보드 등)가 정상적으로 작동하는지 스스로 점검합니다.

이 과정을 POST 라고 부른답니다.

그렇다면 POST 과정이 완료되면 그 이후에는 어떤 동작이 일어날까요?

image


부트 섹터(MBR, Master Boot Record) 탐색

POST 과정이 성공적으로 완수되고 나면, BIOS는 부팅 순서에 따라 지정된 장치(주로 하드디스크)를 찾습니다.


그 이후에 해당 디바이스의 파티션 테이블 을 검색합니다.

이때 파티션 되지 않은 장치의 시동 섹터는 VBR이 되죠.


파티션 테이블을 찾았다면, 해당 파티션의 첫 번째 블록(sector 0)에서 512 Bytes 크기의 MBR을 읽어옵니다.


그리고 MBR에서 부트로더 코드(Boot Loader Code)를 검색하죠.

이때 부트로더 코드를 찾으면 비로소 메모리에 부트로더가 로드됩니다.


  • MBR (Master Boot Record)
    • 파티션된 디스크의 첫 번째 섹터. 부트로더 코드와 파티션 테이블 정보를 담고 있습니다.
  • VBR (Volume Boot Record)
    • 각 파티션의 첫 번째 섹터. 파티션되지 않은 장치의 부트 섹터이기도 합니다.
  • EBR (Extended Boot Record)
    • 논리 파티션의 첫 번째 섹터

2. 부트로더 단계

image

BIOS가 찾아낸 MBR의 안내에 따라서, 이제 부트로더 가 메모리에 로드되어 실행됩니다.

리눅스에서는 주로 GRUB(Grand Unified Bootloader)가 이 역할을 맡죠.



2-1. GRUB의 역할?

GRUB은 사용자에게 어떤 운영체제로 부팅할지 선택할 수 있는 메뉴를 제공합니다.
image


일반적으로 유저가 boot menu에서 부트로더에 개입해야 할 상황은 다음과 같습니다.

  • 다른 커널 버전 선택 (업데이트 후 문제 발생 시 이전 버전 부팅)
  • 다른 운영체제 선택 (멀티 부팅 환경)
  • 부팅 옵션 변경 (특정 하드웨어 비활성화 등)
  • 복구 모드 (다른 런레벨)로 진입

2-2. GRUB의 실행 단계?

image

GRUB은 여러 단계를 거쳐서 커널을 깨울 준비를 합니다.


GRUB Stage 1

  • MBR 또는 VBR에 저장되어 있는 부트 이미지가 메모리에 로드되고 실행됩니다.
    • 위 예시 사진에 나와있는 core.img의 첫 번째 섹터 로드가 되겠네요.

GRUB Stage 1.5

  • MBR과 첫번째 파티션 사이의 숨은 공간(MBR gap)에 저장된 core.img가 메모리에 로드되고 실행됩니다.
    • core.img의 설정 파일과 파일시스템을 위한 드라이버가 로드됩니다.

GRUB Stage 2

/boot/grub 파일 시스템에 직접 접근해 커널(vmlinuz)의 압축을 풀어서 메모리에 로드하고,

커널이 필요로 하는 모든 드라이버와 모듈, 파일시스템(ext2, ext3, ext4 등)이 담긴 램 디스크 파일(initrd.img)를 메모리에 로드합니다.


부팅 전, 커널은 어디에 있나요?

바로 이 단계에서 GRUB이 찾아 나서는 커널은, 보통 /boot 디렉토리에 vmlinuz 라는 이름의 압축된 파일 형태로 저장되어 있습니다. GRUB은 이 파일을 찾아 압축을 풀어 메모리에 올리고, 커널 작동에 필요한 초기 드라이버 등이 담긴 initrd.img(초기 RAM 디스크) 파일도 함께 메모리에 로드합니다.


UEFI는 다음과 같습니다.

image



3. 커널 단계

이제 부팅 순서 2단계를 지나오며 현재 부트로더는 커널 파일과 램 디스크 파일을 메모리에 로드해놓은 상태입니다.

Kernel: vmlinuz-6.8.0-84-generic
RamDisk: initrd.img-6.8.0-84-generic

로드된 커널파일을 어떻게 실행될까?

  • 커널 실행 및 하드웨어 점검
    • PCI bus 점검 및 감지된 주변장치 확인 후 /var/log/dmesg 파일에 기록됩니다.
  • 루트 파일 시스템 마운트
    • initrd의 도움을 받아 루트 파일 시스템(/)을 읽기 전용으로 마운트하여 시스템 파일들을 읽을 준비를 합니다.
    • 만약 이 과정에서 실패하면 그 유명한 커널 패닉(Kernel Panic) 메시지를 보게 됩니다.
  • init 프로세스 호출
    • 모든 준비가 끝나면 커널은 루트 파일 시스템을 읽기/쓰기 모드로 다시 마운트하고, 시스템의 모든 프로세스의 아버지인 **첫 번째 프로세스(PID 1)**를 실행합니다.

참고로 커널이 시작하면서 생성한 메시지들은 커널 링 버퍼(Kernel Ring Buffer) 라고도 합니다.

이와 관련된 로그는 나중에 참조가 가능하죠.


이곳에 커널 메시지가 저장되며, 버퍼가 모두 채워지게되면 오래된 순서부터 차례대로 메시지가 삭제됩니다.

부팅 후 시스템에 로그인하여 커널 메시지를 파일로 캡처하는 커맨드를 통해 커널 메시지 기록을 파일 형태로 남길 수도 있어요!

dmesg | tee /tmp/dmesg.txt

Systemd는 systemd journal에 저장됩니다.

따라서 journalctl을 실행해야 Booting부터 지금까지 쌓인 메시지 확인이 가능해요.



4. INIT / Systemd

마지막 단계죠?

커널로부터 제어권을 넘겨받은 PID 1번 프로세스 는 사용자가 실제로 시스템을 사용할 수 있도록 모든 서비스와 프로그램을 실행시키는 역할을 합니다.


부팅 후 가장 먼저 실행되는 것은 무엇인가요?

커널이 부팅된 후 사용자 공간에서 가장 먼저 실행되는 프로세스는 바로 init 또는 systemd 입니다. 이 프로세스는 PID(Process ID) 1번을 부여받고, 다른 모든 시스템 프로세스의 부모가 됩니다.



이 init 시스템은 크게 두 가지 방식으로 나뉩니다.

4-1. SysVinit (전통적인 방식)

오래된 리눅스 배포판에서 사용되던 방식입니다.

/etc/inittab 설정 파일을 읽어 시스템의 **런레벨(Runlevel)**을 결정합니다. (런레벨 3은 텍스트 모드, 런레벨 5는 그래픽 모드 등)


시스템 초기화 스크립트(/etc/init.d/rc.S)를 실행해 네트워크 설정, 파일 시스템 점검 등을 수행합니다.


결정된 런레벨에 따라 /etc/rcN.d (N은 런레벨 번호) 디렉토리에 있는 스크립트들을 순차적으로 실행하여 필요한 서비스(sshd, cron 등)를 시작시킵니다.


4-2., Systemd (현대적인 방식)

최신 리눅스 배포판(Ubuntu, CentOS 7 이상 등)에서 표준으로 사용되는 방식입니다.

빠른 부팅 속도

서비스를 병렬로 시작시켜 SysVinit보다 부팅 속도가 빠릅니다.


Target 기반 관리

런레벨 대신 타겟(Target) 이라는 유닛 개념을 사용합니다. 예를 들어, graphical.target은 그래픽 로그인 화면에 필요한 모든 서비스와 유닛들의 실행을 관리합니다.


의존성 관리

서비스 간의 의존성을 명확하게 관리(Requires=, Wants=, After=)하여 시스템을 더 안정적이고 효율적으로 운영합니다.


Systemd는 GRUB 설정에서 init=/lib/systemd/systemd 와 같이 지정되며, 부팅 시 default.target (보통 graphical.target의 링크)을 시작으로 관련된 모든 유닛을 활성화합니다.

# .target 유닛 예시
[Unit]

Description=Boot target
Requires=multi-user.target
Wants=test.service
After=multi-user.target rescue.service rescue.target

Ref

    Tag -

Loading script...